Reflection API এবং Class Introspection
কটলিনের Reflection API এবং Class Introspection আপনাকে কোডের মেটাডেটা বিশ্লেষণ এবং অবজেক্টের সম্পর্কে বিস্তারিত তথ্য জানতে সাহায্য করে। Reflection API ব্যবহার করে, আপনি ক্লাস, প্রপার্টি, ফাংশন এবং অ্যানোটেশনগুলি নিয়ে কাজ করতে পারেন, যা runtime এ কোডের কার্যকারিতা উন্নত করতে পারে। নিচে Reflection API এবং Class Introspection নিয়ে বিস্তারিত আলোচনা করা হলো।
১. Reflection API
Reflection API কটলিনে কোডের বিভিন্ন বৈশিষ্ট্য এবং আচরণ সম্পর্কে তথ্য সংগ্রহ করতে ব্যবহৃত হয়। এটি kotlin.reflect প্যাকেজে অন্তর্ভুক্ত এবং এর মাধ্যমে আপনি ক্লাসের মেটাডেটা এবং অবজেক্টের স্টেট পরিবর্তন করতে পারেন।
i) KClass
KClass একটি ক্লাসের তথ্য উপস্থাপন করে।
উদাহরণ:
import kotlin.reflect.full.*
class Person(val name: String, val age: Int)
fun main() {
val personClass = Person::class // Getting KClass reference
println("Class Name: ${personClass.simpleName}") // আউটপুট: Class Name: Person
// Listing member properties
val properties = personClass.memberProperties
properties.forEach { println("Property: ${it.name}") }
}
ব্যাখ্যা:
- এখানে
Person::classব্যবহার করেKClassএর একটি রেফারেন্স পাওয়া গেছে এবং ক্লাসের নাম ও প্রপার্টি তালিকাভুক্ত করা হয়েছে।
২. Class Introspection
Class Introspection Reflection API ব্যবহার করে ক্লাসের সদস্যদের সম্পর্কে তথ্য সংগ্রহ করার প্রক্রিয়া। এটি আপনাকে ক্লাসের প্রপার্টি, মেথড, কনস্ট্রাকটর ইত্যাদি সম্পর্কে বিস্তারিত জানতে দেয়।
i) Class Members
ক্লাসের সদস্যদের তালিকা বের করা।
উদাহরণ:
class Vehicle(val make: String, val model: String) {
fun start() = "Starting $make $model"
}
fun main() {
val vehicleClass = Vehicle::class
// Get constructors
val constructors = vehicleClass.constructors
constructors.forEach { println("Constructor: ${it.parameters}") }
// Get member functions
val functions = vehicleClass.memberFunctions
functions.forEach { println("Function: ${it.name}") }
}
ব্যাখ্যা:
- এখানে
constructorsএবংmemberFunctionsব্যবহার করেVehicleক্লাসের কনস্ট্রাকটর এবং মেথডের তথ্য পাওয়া গেছে।
৩. Accessing Property Values
Reflection API ব্যবহার করে আপনি ক্লাসের প্রপার্টির মানও অ্যাক্সেস করতে পারেন।
উদাহরণ:
fun main() {
val vehicle = Vehicle("Toyota", "Corolla")
val vehicleClass = vehicle::class
// Accessing property values
val makeProperty = vehicleClass.memberProperties.find { it.name == "make" }
println("Vehicle Make: ${makeProperty?.get(vehicle)}") // আউটপুট: Vehicle Make: Toyota
}
ব্যাখ্যা:
- এখানে
memberPropertiesথেকেmakeপ্রপার্টির মান অ্যাক্সেস করা হয়েছে।
৪. Using Annotations with Reflection
Reflection API ব্যবহার করে আপনি অ্যানোটেশন সম্পর্কিত তথ্যও পেতে পারেন।
উদাহরণ:
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Description(val info: String)
@Description("This class represents a book")
class Book(val title: String)
fun main() {
val bookClass = Book::class
val annotation = bookClass.annotations.find { it is Description } as? Description
println("Book Description: ${annotation?.info}") // আউটপুট: Book Description: This class represents a book
}
ব্যাখ্যা:
- এখানে
Descriptionনামে একটি কাস্টম অ্যানোটেশন তৈরি করা হয়েছে এবংBookক্লাসে প্রয়োগ করা হয়েছে। Reflection API ব্যবহার করে অ্যানোটেশনটির তথ্য বের করা হয়েছে।
উপসংহার
কটলিনের Reflection API এবং Class Introspection কোডের মেটাডেটা বিশ্লেষণ এবং অবজেক্টের আচরণ সম্পর্কে গভীর তথ্য সংগ্রহ করতে সহায়ক। এটি কোডের ডায়নামিক আচরণ বোঝার জন্য এবং অ্যাপ্লিকেশনগুলিতে গতিশীল কার্যক্রম পরিচালনার জন্য অত্যন্ত কার্যকর।
Read more